package co.edu.usbcali.egrapico.logica;

/**
 * Clase para la traducci�n de la representaci�n de un
 * <Code>�mbito</Code> desde <I>GraPiCO Textual</I> hacia <I>C�lculo PiCO</I>.
 * <P> Recibe en <I>GraPiCO Textual</I> alguna de la siguientes opciones:<P> <Blockquote><Pre>
 *                   [ListaVariables;ListaNombres;Programa]
 *                   [ListaVariables;;Programa]
 *                   [;ListaNombres;Programa]
 * </Pre></Blockquote> <P> Traducci�n a <I>C�lculo PiCO</I> seg�n el caso:<P> <Blockquote><Pre>
 *                   local  ListaVariables,ListaNombres  in  Programa
 * </Pre></Blockquote>
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005
 */
public class Scope {

    // Variable para almacenar la posici�n del caracter delimitador de los
    //elementos de un �mbito ";".
    int posicion;
    // Variable para almacenar el �mbito representado en c�lculo PiCO.
    String scopePico;
    // Variables para almacenar las variable, los nombres y el programa
    // en GraPiCO Textual.
    String variablesGraPicoT = "", namesGraPicoT = "", programGraPicoT = "";
    // Objetos de la clase IdentifiersList, para la traducci�n de las listas
    // de variables y de nombres.
    IdentifiersList varList, namesList;
    // objeto de la clas Program, para la traducci�n del programa.
    Program program;
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de la clase
     * <Code>Scope</Code>.<P> Separa el
     * <Code>�mbito</Code> en las tres partes que lo componen:
     * <Code>Lista de Variables</Code>,
     * <Code>Lista de Nombres</Code> y
     * <Code>Programa</Code> usando el s�mbolo de sincronizaci�n ";".
     *
     * @param scopeGraPicoT Expresi�n equivalente a la representaci�n de un
     * <Code>�mbito</Code> en <I>GraPiCO Textual</I>.
     * @param nameProcess Nombre o lista de nombres de los procesos que se est�n
     * traduciendo.
     */
    public Scope(String scopeGraPicoT, String nameProcess) {

        nameCurrentProcess = nameProcess;
        posicion = scopeGraPicoT.indexOf(";");
        variablesGraPicoT = scopeGraPicoT.substring(1, posicion);
        scopeGraPicoT = scopeGraPicoT.substring(posicion + 1);

        posicion = scopeGraPicoT.indexOf(";");
        namesGraPicoT = scopeGraPicoT.substring(0, posicion);
        scopeGraPicoT = scopeGraPicoT.substring(posicion + 1);

        programGraPicoT = scopeGraPicoT.substring(0, scopeGraPicoT.length() - 1);
    }

    /**
     * Metodo generador de la traducci�n de un
     * <Code>�mbito</Code>.<P> Forma la traducci�n de un �mbito obteniendo la
     * traducci�n de
     * <Code>Lista de Variables</Code>,
     * <Code>Lista de Nombres</Code> (K) y del
     * <Code>Programa</Code>. De la forma "local" K "in" programa.
     *
     * @return el
     * <Code>�mbito</Code> traducido a <I>C�lculo PiCO</I>.
     */
    public String traslate() {

        scopePico = "local ";
        if (variablesGraPicoT.length() == 0) {
            namesList = new IdentifiersList(namesGraPicoT, "N", nameCurrentProcess);
            scopePico += namesList.traslate();
        } else {
            if (namesGraPicoT.length() == 0) {
                varList = new IdentifiersList(variablesGraPicoT, "V", nameCurrentProcess);
                scopePico += varList.traslate();
            } else {
                namesList = new IdentifiersList(namesGraPicoT, "N", nameCurrentProcess);
                varList = new IdentifiersList(variablesGraPicoT, "V", nameCurrentProcess);
                scopePico += varList.traslate() + "," + namesList.traslate();
            }
        }
        program = new Program(programGraPicoT, nameCurrentProcess);
        scopePico += " in " + program.traslate();
        return scopePico;
    }
}